import pymysql


class DBUtil(object):
    """数据库工具类"""

    __conn = None  # 用于保存数据库连接对象

    @classmethod
    def __get_conn(cls):
        """获取数据库连接，如果数据库连接对象不存在，则创建，否则返回已经存在的数据库连接对象"""
        if cls.__conn is None:
            cls.__conn = pymysql.connect(host="211.103.136.244", port=7061, user="student", password="iHRM_student_2022",
                                         database="ihrm", charset="utf8")
        return cls.__conn

    @classmethod
    def __close_conn(cls):
        """关闭数据库连接，如果数据库连接对象非空，则关闭"""
        if cls.__conn:
            cls.__conn.close()
            cls.__conn = None  # 数据库连接对象关闭后，并不会变为None，需要手动置空

    @classmethod
    def select_one(cls, sql):
        cursor = None
        try:
            # 1.创建数据库连接对象
            conn = cls.__get_conn()
            # 2.通过数据库连接对象获取游标
            cursor = conn.cursor()
            # 3.通过游标 执行 sql 语句
            cursor.execute(sql)
            # 4.获取结果集 -- result = fechone()
            result = cursor.fetchone()
        except Exception as e:
            print(e)
            raise e
        finally:
            # 5.关闭游标
            if cursor:
                cursor.close()
            # 6.关闭数据库连接对象
            cls.__close_conn()
            # 将查询结果返回 return result
        return result

    @classmethod
    def uid_db(cls, sql):
        cursor = None
        try:
            # 1.创建数据库连接对象
            conn = cls.__get_conn()
            # 2.通过数据库连接对象获取游标
            cursor = conn.cursor()
            # 3.通过游标 执行 sql 语句
            cursor.execute(sql)
            # 4.手动提交事务
            conn.commit()
        except Exception as e:
            print(e)
            # 回滚
            if cls.__conn:
                cls.__conn.rollback()
            raise e
        finally:
            # 5.关闭游标
            if cursor:
                cursor.close()
            # 6.关闭数据库连接对象
            cls.__close_conn()


if __name__ == '__main__':
    sql = "select * from t_book where id<5;"

    data = DBUtil.select_one(sql)
    print(data)
    sql = 'insert into t_book (id, title, pub_date) values(9, "功能测试", "2021-09-09");'
    DBUtil.uid_db(sql)
